package org.example.blog.controller.user;


import com.wf.captcha.ArithmeticCaptcha;
import com.wf.captcha.GifCaptcha;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import org.example.blog.pojo.User;
import org.example.blog.response.ResponseResult;
import org.example.blog.response.ResponseState;
import org.example.blog.services.IUserService;

import org.example.blog.utils.Constants;
import org.example.blog.utils.RedisUtils;
import org.example.blog.utils.TextUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.IOException;
import java.util.Random;

@Slf4j
@RestController
@RequestMapping("/user")

public class UserApi{

    @Autowired
    private IUserService userService;


    @PostMapping("/admin_account")
    /**
     *post 初始化管理员
     * @param user
     */
    public ResponseResult initManagerAccount(@RequestBody User user, HttpServletRequest request){
        return userService.initManagerAccount(user, request);
    }


    @PostMapping
    /**
     *  post 注册
     * @param user
     */
    public ResponseResult register(@RequestBody User user,
                                   @RequestParam("email_code") String emailCode,
                                   @RequestParam("captcha_code") String captchaCode,
                                   @RequestParam("captcha_key") String captchaKey,
                                   HttpServletRequest request){

        return userService.register(user, emailCode, captchaCode, captchaKey, request);
    }



    /**
     *
     * 需要提交的数据
     * 1。 用户账号 --- 》 可以是昵称，可以邮箱 ----》 做了唯一处理（雪花算法）
     * 2。 密码
     * 3。 图灵验证码
     * 4。 图灵验证的key
     *
     *  post 登录
     * @param captchaKey
     * @param captcha 图灵验证码
     * @param user  封装User的bean类 封装账号密码
     */
    @PostMapping("/{captcha}/{captcha_key}")
    public ResponseResult login(@PathVariable("captcha_key") String captchaKey,
                                @PathVariable("captcha") String captcha,
                                @RequestBody User user,
                                HttpServletResponse response){
        return userService.doLogin(captcha,captchaKey,user, response);
    }



    /**
     *  获取图灵验证码
     *  有效时间 10 分钟
     * @param
     */
    @GetMapping("/captcha")
    public void getCaptcha(HttpServletResponse response, @RequestParam("captcha_key") String captchaKey) {
        try {
            userService.createCaptcha(response, captchaKey);
        }catch (Exception e){
            log.error(e.toString());
        }
    }


    /**
     *
     * 发送邮件验证码
     *
     * 业务使用场景：注册、找回密码、修改邮箱（会输入新的邮箱）
     * 注册：如果已经注册过了，提示该邮箱已经注册
     * 找回密码：如果没有注册，提示该邮箱没有注册
     * 修改邮箱（新的邮箱）：如果已经注册，提示该邮箱已经注册
     *
     * @param emailAddress
     * @return org.example.blog.response.ResponseResult
     */
    @GetMapping("/verify_code")
    public ResponseResult sendEmail(HttpServletRequest request, @RequestParam("type") String type
                                    , @RequestParam("email") String emailAddress){
        log.info("email ====== > " + emailAddress);
        return userService.sendEmail(request, type, emailAddress);
    }


    /**
     *
     * 修改密码
     * @param user
     * @return org.example.blog.response.ResponseResult
     */
    @PutMapping("/password/{userId}")
    public ResponseResult updatePassword(@PathVariable("userId") String userId,@RequestBody User user){
        return null;
    }



    /**
     *
     * 获取作者信息
     * @param userId
     * @return org.example.blog.response.ResponseResult
     */
    @GetMapping("/{userId}")
    public ResponseResult getUserInfo(@PathVariable("userId") String userId){
        return userService.getUserInfo(userId);
    }



    /**
     *
     * 修改用户信息
     * @param user
     *
     * 允许用户修改的内容
     * 1、头像
     * 2、用户名（唯一的）
     * 2.5、签名
     * 3、密码（单独修改）
     * 4、Email（唯一的，单独修改）
     *
     * @return org.example.blog.response.ResponseResult
     */
    @PutMapping("/{userId}")
    public ResponseResult updateUserInfo(HttpServletRequest request,
                                         HttpServletResponse response,
                                         @PathVariable("userId") String userId,
                                         @RequestBody User user){
        return userService.updateUserInfo(request, response, userId, user);
    }

    /**
     *  获取用户列表
     * 权限：管理员权限
     *
     * @param page
     * @param size
     * @param request
     * @param response
     * @return
     */
    @PreAuthorize("@permission.admin()")
    @GetMapping("/list")
    public ResponseResult listUsers(@RequestParam("page") int page,
                                    @RequestParam("size") int size,
                                    HttpServletRequest request,
                                    HttpServletResponse response){
        return userService.listUsers(page, size, request, response);
    }


    /**
     *
     * 需要管理员权限
     * 注解 PreAuthorize 支持el表达式
     * 如果PreAuthorize()里边添加自己的权限控制service 可以自己对权限验证
     * 不添加 默认使用spring security
     *
     * @param userId
     * @return
     */
    @PreAuthorize("@permission.admin()")
    @DeleteMapping("/{userId}")
    public ResponseResult deleteUser(HttpServletRequest request,
                                     HttpServletResponse response,
                                     @PathVariable("userId") String userId){
        // 判断当前操作用户是谁
        // 根据用户角色判断是否可以删除
        // TODO：通过注解的方式来控制权限 注解PreAuthorize
        return userService.deleteUserById(userId, request, response);
    }

    /**
     * 检查该email是否已经注册
     * @param email 邮箱地址
     * @return success =》 已经注册，failed =》 未注册
     */
    // swagger文档设置
    @ApiResponses({
            @ApiResponse(code = 20000, message = "表示当前邮箱已经注册了"),
            @ApiResponse(code = 40000, message = "表示当前邮箱未注册")
    })
    @GetMapping("/email")
    public ResponseResult checkEmail(@RequestParam("email") String email){
        return userService.checkEmail(email);
    }

    /**
     * 检查该email是否已经注册
     * @param userName 用户名
     * @return success =》 已经注册，failed =》 未注册
     */
    // swagger文档设置
    @ApiResponses({
            @ApiResponse(code = 20000, message = "表示用户名已经注册了"),
            @ApiResponse(code = 40000, message = "表示用户名未注册")
    })
    @GetMapping("/user_name")
    public ResponseResult checkUserName(@RequestParam("userName") String userName){
        return userService.checkUserName(userName);
    }
}
